<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // 自定义构造函数  => 创建实例化对象

    function Point(x, y) {
        // new关键词做的操作
        // {}
        // {}[[Prototype]] = Point.prototype;
        // this -> {}

        this.x = x;
        this.y = y;

        // return this;

    }

    // 原型对象(实例化对象公有的属性和方法)
    // Point.prototype = {constructor:Point}; 

    Point.prototype.type = "2D";
    Point.prototype.say = function () {// 公共方法 哪个实例化对象调用它 -> 它就指向谁
        // this -> 调用此方法的实例化对象 
        console.log(this.x, this.y);
    };

    Point.prototype.toString = function () {// 公共方法 哪个实例化对象调用它 -> 它就指向谁
        // this -> 调用此方法的实例化对象 
        return `(${this.x},${this.y})`;
    };


    var p1 = new Point(10, 20); // {x,y}
    console.log(p1);
    console.log(p1.x, p1.y);
    console.log(p1.type);
    p1.say();
    var res = p1.toString();
    console.log(res);

    console.log(p1.constructor === Point);

    var p2 = new Point(24, 48); // {x,y}
    console.log(p2);



    // 按顺序
    // 1. new关键词做了什么操作
    // 2. 构造函数的执行流程
    // 3. 构造函数的原型对象 (原型对象方法中的this指向)
    // 4. 为什么实例化对象可以访问构造函数的原型对象
    // 5. constructor (小蝌蚪找妈妈)


</script>

</html>